Pythonã®ãã«ãã¹ã¬ãããšãã«ãããã»ã¹ãå æ¬çã«åæãGILã®å¶çŽãããã©ãŒãã³ã¹ãäžŠè¡æ§ãšäžŠåæ§ãå®çŸããå®è·µäŸãæ¢ããŸãã
ãã«ãã¹ã¬ãã vs ãã«ãããã»ã¹ïŒGILã®å¶çŽãšããã©ãŒãã³ã¹åæ
䞊è¡ããã°ã©ãã³ã°ã®äžçã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæé©åããããã«ããã«ãã¹ã¬ãããšãã«ãããã»ã¹ã®éã®ãã¥ã¢ã³ã¹ãçè§£ããããšã極ããŠéèŠã§ãããã®èšäºã§ã¯ãç¹ã«Pythonã®æèã«ãããŠãäž¡æ¹ã®ã¢ãããŒãã®æ žãšãªãæŠå¿µãæãäžããæªåé«ãã°ããŒãã«ã€ã³ã¿ããªã¿ããã¯ïŒGILïŒãšããããçã®äžŠåæ§ã®éæã«äžãã圱é¿ãæ€èšŒããŸããå®è·µçãªäŸãããã©ãŒãã³ã¹åææè¡ããããŠããŸããŸãªçš®é¡ã®ã¯ãŒã¯ããŒãã«é©ããäžŠè¡æ§ã¢ãã«ãéžæããããã®æŠç¥ãæ¢ããŸãã
äžŠè¡æ§ãšäžŠåæ§ã®çè§£
ãã«ãã¹ã¬ãããšãã«ãããã»ã¹ã®è©³çްã«å ¥ãåã«ãäžŠè¡æ§ãšäžŠåæ§ã®åºæ¬çãªæŠå¿µãæç¢ºã«ããŠãããŸãããã
- äžŠè¡æ§ïŒConcurrencyïŒ: äžŠè¡æ§ãšã¯ãã·ã¹ãã ãè€æ°ã®ã¿ã¹ã¯ãããããåæã«åŠçããŠãããã®ããã«èŠããèœåãæããŸããããã¯å¿ ãããã¿ã¹ã¯ãå šãåãç¬éã«å®è¡ãããŠããããšãæå³ããããã§ã¯ãããŸããã代ããã«ãã·ã¹ãã ã¯ã¿ã¹ã¯éãé«éã«åãæ¿ããããšã§ã䞊åå®è¡ã®é¯èŠãçã¿åºããŸãããããã³ã§äžäººã®ã·ã§ããè€æ°ã®æ³šæããã°ããŠããæ§åãæãæµ®ãã¹ãŠãã ããã圌ã¯ãã¹ãŠãäžåºŠã«èª¿çããŠããããã§ã¯ãããŸãããããã¹ãŠã®æ³šæã䞊è¡ããŠç®¡çããŠããŸãã
- äžŠåæ§ïŒParallelismïŒ: äžæ¹ãäžŠåæ§ãšã¯ãè€æ°ã®ã¿ã¹ã¯ãå®éã«åæã«å®è¡ãããããšãæå³ããŸããããã«ã¯ãè€æ°ã®åŠçè£ çœ®ïŒäŸïŒè€æ°ã®CPUã³ã¢ïŒã飿ºããŠåäœããå¿ èŠããããŸãããããã³ã§è€æ°ã®ã·ã§ããåæã«ç°ãªã泚æã«åãçµãã§ããæ§åãæ³åããŠãã ããã
äžŠè¡æ§ã¯äžŠåæ§ãããåºç¯ãªæŠå¿µã§ããäžŠåæ§ã¯ãè€æ°ã®åŠçè£ çœ®ãå¿ èŠãšããç¹å®ã®åœ¢æ ã®äžŠè¡æ§ã§ãã
ãã«ãã¹ã¬ããïŒè»œéãªäžŠè¡æ§
ãã«ãã¹ã¬ããã¯ãåäžã®ããã»ã¹å ã«è€æ°ã®ã¹ã¬ãããäœæããããšãå«ã¿ãŸããã¹ã¬ããã¯åãã¡ã¢ãªç©ºéãå ±æããããããããã®éã®éä¿¡ã¯æ¯èŒçã«å¹ççã§ãããããããã®å ±æã¡ã¢ãªç©ºéã¯ãåæãæœåšçãªç«¶åç¶æ ã«é¢é£ããè€éãããããããŸãã
ãã«ãã¹ã¬ããã®å©ç¹ïŒ
- 軜éïŒ ã¹ã¬ããã®äœæãšç®¡çã¯ãããã»ã¹ã®äœæãšç®¡çã«æ¯ã¹ãŠäžè¬çã«ãªãœãŒã¹æ¶è²»ãå°ãªãã§ãã
- å ±æã¡ã¢ãªïŒ åãããã»ã¹å ã®ã¹ã¬ããã¯åãã¡ã¢ãªç©ºéãå ±æãããããç°¡åãªããŒã¿å ±æãšéä¿¡ãå¯èœã§ãã
- å¿çæ§ïŒ ãã«ãã¹ã¬ããã¯ãæéã®ãããã¿ã¹ã¯ãã¡ã€ã³ã¹ã¬ããããããã¯ããããšãªãããã¯ã°ã©ãŠã³ãã§å®è¡ãããããšã«ãããã¢ããªã±ãŒã·ã§ã³ã®å¿çæ§ãåäžãããããšãã§ããŸããäŸãã°ãGUIã¢ããªã±ãŒã·ã§ã³ã¯ããããã¯ãŒã¯æäœãå®è¡ããããã«å¥ã®ã¹ã¬ããã䜿çšããGUIãããªãŒãºããã®ãé²ãããšãã§ããŸãã
ãã«ãã¹ã¬ããã®æ¬ ç¹ïŒGILã®å¶çŽ
Pythonã«ããããã«ãã¹ã¬ããã®äž»ãªæ¬ ç¹ã¯ãã°ããŒãã«ã€ã³ã¿ããªã¿ããã¯ïŒGILïŒã§ããGILã¯ãäžåºŠã«äžã€ã®ã¹ã¬ããã ããPythonã€ã³ã¿ããªã¿ã®å¶åŸ¡ãä¿æã§ããããã«ãããã¥ãŒããã¯ã¹ïŒããã¯ïŒã§ããããã¯ããã«ãã³ã¢ããã»ããµäžã§ãã£ãŠããCPUããŠã³ããªã¿ã¹ã¯ã«å¯ŸããŠPythonãã€ãã³ãŒãã®çã®äžŠåå®è¡ã¯äžå¯èœã§ããããšãæå³ããŸãããã®å¶çŽã¯ããã«ãã¹ã¬ãããšãã«ãããã»ã¹ã®ã©ã¡ãããéžæããéã«éèŠãªèæ ®äºé ãšãªããŸãã
ãªãGILã¯ååšããã®ãïŒ GILã¯ãCPythonïŒPythonã®æšæºå®è£ ïŒã§ã®ã¡ã¢ãªç®¡çãç°¡çŽ åããã·ã³ã°ã«ã¹ã¬ããããã°ã©ã ã®ããã©ãŒãã³ã¹ãåäžãããããã«å°å ¥ãããŸãããããã¯ç«¶åç¶æ ãé²ããPythonãªããžã§ã¯ããžã®ã¢ã¯ã»ã¹ãã·ãªã¢ã«åããããšã§ã¹ã¬ããã»ãŒããã£ãä¿èšŒããŸããã€ã³ã¿ããªã¿ã®å®è£ ãç°¡çŽ åããäžæ¹ã§ãCPUããŠã³ããªã¯ãŒã¯ããŒãã«å¯ŸããäžŠåæ§ãèããå¶éããŸãã
ãã«ãã¹ã¬ããã¯ã©ã®ãããªå Žåã«é©ããŠãããïŒ
GILã®å¶çŽã«ããããããããã«ãã¹ã¬ããã¯ç¹å®ã®ã·ããªãªãç¹ã«I/OããŠã³ããªã¿ã¹ã¯ã«ãããŠäŸç¶ãšããŠæçã§ããI/OããŠã³ããªã¿ã¹ã¯ã¯ããããã¯ãŒã¯ãªã¯ãšã¹ãããã£ã¹ã¯èªã¿èŸŒã¿ãªã©ã®å€éšæäœãå®äºããã®ãåŸ ã€ã®ã«ã»ãšãã©ã®æéãè²»ãããŸãããããã®åŸ æ©æéäžãGILã¯ãã°ãã°è§£æŸãããä»ã®ã¹ã¬ãããå®è¡ã§ããããã«ãªããŸãããã®ãããªå Žåããã«ãã¹ã¬ããã¯å šäœã®ã¹ã«ãŒããããå€§å¹ ã«åäžãããããšãã§ããŸãã
äŸïŒè€æ°ã®WebããŒãžãããŠã³ããŒããã
è€æ°ã®WebããŒãžã䞊è¡ããŠããŠã³ããŒãããããã°ã©ã ãèããŠã¿ãŸããããããã§ã®ããã«ããã¯ã¯ãããã¯ãŒã¯ã®é å»¶ãã€ãŸãWebãµãŒããŒããããŒã¿ãåä¿¡ããã®ã«ãããæéã§ããè€æ°ã®ã¹ã¬ããã䜿çšããããšã§ãããã°ã©ã ã¯è€æ°ã®ããŠã³ããŒããªã¯ãšã¹ãã䞊è¡ããŠéå§ã§ããŸããããã¹ã¬ããããµãŒããŒããã®ããŒã¿ãåŸ ã£ãŠããéã«ãå¥ã®ã¹ã¬ããã¯åã®ãªã¯ãšã¹ãããã®ã¬ã¹ãã³ã¹ãåŠçããããæ°ãããªã¯ãšã¹ããéå§ãããã§ããŸããããã«ããããããã¯ãŒã¯ã®é å»¶ã广çã«é ãããå šäœã®ããŠã³ããŒãé床ãåäžããŸãã
import threading
import requests
def download_page(url):
print(f"Downloading {url}")
response = requests.get(url)
print(f"Downloaded {url}, status code: {response.status_code}")
urls = [
"https://www.example.com",
"https://www.google.com",
"https://www.wikipedia.org",
]
threads = []
for url in urls:
thread = threading.Thread(target=download_page, args=(url,))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
print("All downloads complete.")
ãã«ãããã»ã¹ïŒçã®äžŠåæ§
ãã«ãããã»ã¹ã¯ããããããç¬èªã®ç¬ç«ããã¡ã¢ãªç©ºéãæã€è€æ°ã®ããã»ã¹ãäœæããããšãå«ã¿ãŸããããã«ãããåããã»ã¹ãç°ãªãã³ã¢ã§ç¬ç«ããŠå®è¡ã§ããããããã«ãã³ã¢ããã»ããµäžã§ã®çã®äžŠåå®è¡ãå¯èœã«ãªããŸããããããããã»ã¹éã®éä¿¡ã¯äžè¬çã«ã¹ã¬ããéã®éä¿¡ãããè€éã§ãªãœãŒã¹ãæ¶è²»ããŸãã
ãã«ãããã»ã¹ã®å©ç¹ïŒ
- çã®äžŠåæ§ïŒ ãã«ãããã»ã¹ã¯GILã®å¶çŽãåé¿ãããã«ãã³ã¢ããã»ããµäžã§CPUããŠã³ããªã¿ã¹ã¯ã®çã®äžŠåå®è¡ãå¯èœã«ããŸãã
- å颿§ïŒ ããã»ã¹ã¯ããããç¬èªã®ã¡ã¢ãªç©ºéãæã£ãŠãããããå颿§ã確ä¿ãããäžã€ã®ããã»ã¹ãã¢ããªã±ãŒã·ã§ã³å šäœãã¯ã©ãã·ã¥ãããã®ãé²ããŸããäžã€ã®ããã»ã¹ããšã©ãŒã«ééããŠã¯ã©ãã·ã¥ããŠããä»ã®ããã»ã¹ã¯äžæããããšãªãå®è¡ãç¶ããããšãã§ããŸãã
- ãã©ãŒã«ããã¬ã©ã³ã¹ïŒ å颿§ã¯ãŸããããé«ããã©ãŒã«ããã¬ã©ã³ã¹ïŒèé害æ§ïŒã«ãã€ãªãããŸãã
ãã«ãããã»ã¹ã®æ¬ ç¹ïŒ
- ãªãœãŒã¹æ¶è²»ãå€ãïŒ ããã»ã¹ã®äœæãšç®¡çã¯ãäžè¬çã«ã¹ã¬ããã®äœæãšç®¡çããããªãœãŒã¹ãå€ãæ¶è²»ããŸãã
- ããã»ã¹ééä¿¡ïŒIPCïŒïŒ ããã»ã¹éã®éä¿¡ã¯ãã¹ã¬ããéã®éä¿¡ãããè€éã§äœéã§ããäžè¬çãªIPCã¡ã«ããºã ã«ã¯ããã€ãããã¥ãŒãå ±æã¡ã¢ãªããœã±ãããªã©ããããŸãã
- ã¡ã¢ãªãªãŒããŒãããïŒ åããã»ã¹ãç¬èªã®ã¡ã¢ãªç©ºéãæã€ããããã«ãã¹ã¬ããã«æ¯ã¹ãŠã¡ã¢ãªæ¶è²»éãå€ããªããŸãã
ãã«ãããã»ã¹ã¯ã©ã®ãããªå Žåã«é©ããŠãããïŒ
ãã«ãããã»ã¹ã¯ã䞊ååå¯èœãªCPUããŠã³ããªã¿ã¹ã¯ã«é©ããéžæè¢ã§ãããããã¯ãèšç®ã®å®è¡ã«ã»ãšãã©ã®æéãè²»ãããI/Oæäœã«ãã£ãŠå¶éãããªãã¿ã¹ã¯ã§ããäŸãšããŠã¯ä»¥äžã®ãããªãã®ããããŸãïŒ
- ç»ååŠçïŒ ç»åã«ãã£ã«ã¿ãé©çšããããè€éãªèšç®ãå®è¡ãããããã
- ç§åŠæè¡ã·ãã¥ã¬ãŒã·ã§ã³ïŒ éäžçãªæ°å€èšç®ã䌎ãã·ãã¥ã¬ãŒã·ã§ã³ãå®è¡ããã
- ããŒã¿åæïŒ å€§èŠæš¡ãªããŒã¿ã»ãããåŠçããçµ±èšåæãå®è¡ããã
- æå·æäœïŒ 倧éã®ããŒã¿ãæå·åãŸãã¯åŸ©å·åããã
äŸïŒã¢ã³ãã«ã«ãæ³ãçšããååšçã®èšç®
ã¢ã³ãã«ã«ãæ³ãçšããŠååšçãèšç®ããã®ã¯ããã«ãããã»ã¹ãçšããŠå¹æçã«äžŠååã§ããCPUããŠã³ããªã¿ã¹ã¯ã®å žåçãªäŸã§ãããã®æ¹æ³ã¯ãæ£æ¹åœ¢å ã«ã©ã³ãã ãªç¹ãçæããå æ¥ããåã®äžã«èœã¡ãç¹ã®æ°ãæ°ããããšãå«ã¿ãŸããåå ã®ç¹ã®æ°ãšç·ç¹æ°ã®æ¯çã¯ãååšçã«æ¯äŸããŸãã
import multiprocessing
import random
def calculate_points_in_circle(num_points):
count = 0
for _ in range(num_points):
x = random.random()
y = random.random()
if x*x + y*y <= 1:
count += 1
return count
def calculate_pi(num_processes, total_points):
points_per_process = total_points // num_processes
with multiprocessing.Pool(processes=num_processes) as pool:
results = pool.map(calculate_points_in_circle, [points_per_process] * num_processes)
total_count = sum(results)
pi_estimate = 4 * total_count / total_points
return pi_estimate
if __name__ == "__main__":
num_processes = multiprocessing.cpu_count()
total_points = 10000000
pi = calculate_pi(num_processes, total_points)
print(f"Estimated value of Pi: {pi}")
ãã®äŸã§ã¯ã`calculate_points_in_circle`颿°ã¯èšç®éçŽçã§ããã`multiprocessing.Pool`ã¯ã©ã¹ã䜿çšããŠè€æ°ã®ã³ã¢ã§ç¬ç«ããŠå®è¡ã§ããŸãã`pool.map`颿°ã¯ãå©çšå¯èœãªããã»ã¹ã«äœæ¥ã忣ãããçã®äžŠåå®è¡ãå¯èœã«ããŸãã
ããã©ãŒãã³ã¹åæãšãã³ãããŒãã³ã°
ãã«ãã¹ã¬ãããšãã«ãããã»ã¹ã®ã©ã¡ãã广çã«éžæããããæ±ºå®ããããã«ã¯ãããã©ãŒãã³ã¹åæãšãã³ãããŒãã³ã°ãè¡ãããšãäžå¯æ¬ ã§ããããã«ã¯ãç°ãªãäžŠè¡æ§ã¢ãã«ã䜿çšããŠã³ãŒãã®å®è¡æéãæž¬å®ãããã®çµæãåæããŠãç¹å®ã®ã¯ãŒã¯ããŒãã«æé©ãªã¢ãããŒããç¹å®ããããšãå«ãŸããŸãã
ããã©ãŒãã³ã¹åæã®ããã®ããŒã«ïŒ
- `time`ã¢ãžã¥ãŒã«ïŒ `time`ã¢ãžã¥ãŒã«ã¯ãå®è¡æéãæž¬å®ããããã®é¢æ°ãæäŸããŸãã`time.time()`ã䜿çšããŠã³ãŒããããã¯ã®éå§æå»ãšçµäºæå»ãèšé²ããçµéæéãèšç®ã§ããŸãã
- `cProfile`ã¢ãžã¥ãŒã«ïŒ `cProfile`ã¢ãžã¥ãŒã«ã¯ãããé«åºŠãªãããã¡ã€ãªã³ã°ããŒã«ã§ãããã³ãŒãå ã®å颿°ã®å®è¡æéã«é¢ããè©³çŽ°ãªæ å ±ãæäŸããŸããããã«ãããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããã³ãŒããé©å®æé©åããããšãã§ããŸãã
- `line_profiler`ããã±ãŒãžïŒ `line_profiler`ããã±ãŒãžã䜿çšãããšãã³ãŒããäžè¡ãã€ãããã¡ã€ãªã³ã°ã§ããããã©ãŒãã³ã¹ã®ããã«ããã¯ã«é¢ããããã«è©³çŽ°ãªæ å ±ãåŸãããŸãã
- `memory_profiler`ããã±ãŒãžïŒ `memory_profiler`ããã±ãŒãžã¯ãã³ãŒãã®ã¡ã¢ãªäœ¿çšéã远跡ããã®ã«åœ¹ç«ã¡ãã¡ã¢ãªãªãŒã¯ãéå°ãªã¡ã¢ãªæ¶è²»ãç¹å®ããã®ã«äŸ¿å©ã§ãã
ãã³ãããŒãã³ã°ã®èæ ®äºé ïŒ
- çŸå®çãªã¯ãŒã¯ããŒãïŒ ã¢ããªã±ãŒã·ã§ã³ã®å žåçãªäœ¿çšãã¿ãŒã³ãæ£ç¢ºã«åæ ããçŸå®çãªã¯ãŒã¯ããŒãã䜿çšããŠãã ãããçŸå®äžçã®ã·ããªãªã代衚ããªãå¯èœæ§ã®ããåæãã³ãããŒã¯ã®äœ¿çšã¯é¿ããŠãã ããã
- ååãªããŒã¿ïŒ ãã³ãããŒã¯ãçµ±èšçã«ææã§ããããšãä¿èšŒããããã«ãååãªéã®ããŒã¿ã䜿çšããŠãã ãããå°ããªããŒã¿ã»ããã§ãã³ãããŒã¯ãå®è¡ããŠããæ£ç¢ºãªçµæãåŸãããªãå ŽåããããŸãã
- è€æ°åã®å®è¡ïŒ ãã³ãããŒã¯ãè€æ°åå®è¡ããçµæãå¹³åããŠã©ã³ãã ãªå€åã®åœ±é¿ãæžãããŠãã ããã
- ã·ã¹ãã æ§æïŒ çµæãåçŸå¯èœã§ããããšãä¿èšŒããããã«ããã³ãããŒãã³ã°ã«äœ¿çšããã·ã¹ãã æ§æïŒCPUãã¡ã¢ãªããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ïŒãèšé²ããŠãã ããã
- ãŠã©ãŒã ã¢ããå®è¡ïŒ å®éã®ãã³ãããŒãã³ã°ãéå§ããåã«ãŠã©ãŒã ã¢ããå®è¡ãè¡ããã·ã¹ãã ãå®å®ããç¶æ ã«éããããã«ããŸããããã«ããããã£ãã·ã³ã°ããã®ä»ã®åæåãªãŒããŒãããã«ããçµæã®æªã¿ãé¿ããããšãã§ããŸãã
ããã©ãŒãã³ã¹çµæã®åæïŒ
ããã©ãŒãã³ã¹çµæãåæããéã«ã¯ã以äžã®èŠå ãèæ ®ããŠãã ããïŒ
- å®è¡æéïŒ æãéèŠãªææšã¯ãã³ãŒãã®å šäœçãªå®è¡æéã§ããç°ãªãäžŠè¡æ§ã¢ãã«ã®å®è¡æéãæ¯èŒããŠãæãéãã¢ãããŒããç¹å®ããŠãã ããã
- CPU䜿çšçïŒ CPU䜿çšçãç£èŠããå©çšå¯èœãªCPUã³ã¢ãã©ãã ã广çã«å©çšãããŠãããã確èªããŠãã ãããCPUããŠã³ããªã¿ã¹ã¯ã®å Žåããã«ãããã»ã¹ã¯çæ³çã«ã¯ãã«ãã¹ã¬ãããããé«ãCPU䜿çšçãããããã¯ãã§ãã
- ã¡ã¢ãªæ¶è²»éïŒ ã¡ã¢ãªæ¶è²»éã远跡ããã¢ããªã±ãŒã·ã§ã³ãéå°ãªã¡ã¢ãªãæ¶è²»ããŠããªãããšã確èªããŠãã ããããã«ãããã»ã¹ã¯ãç¬ç«ããã¡ã¢ãªç©ºéã®ãããäžè¬çã«ãã«ãã¹ã¬ãããããå€ãã®ã¡ã¢ãªãå¿ èŠãšããŸãã
- ã¹ã±ãŒã©ããªãã£ïŒ ç°ãªãæ°ã®ããã»ã¹ãŸãã¯ã¹ã¬ããã§ãã³ãããŒã¯ãå®è¡ããã³ãŒãã®ã¹ã±ãŒã©ããªãã£ãè©äŸ¡ããŠãã ãããçæ³çã«ã¯ãããã»ã¹ãŸãã¯ã¹ã¬ããã®æ°ãå¢å ããã«ã€ããŠïŒããç¹ãŸã§ïŒãå®è¡æéã¯ç·åœ¢çã«æžå°ããã¯ãã§ãã
ããã©ãŒãã³ã¹ãæé©åããããã®æŠç¥
é©åãªäžŠè¡æ§ã¢ãã«ãéžæããããšã«å ããŠãPythonã³ãŒãã®ããã©ãŒãã³ã¹ãæé©åããããã«äœ¿çšã§ããä»ã®ããã€ãã®æŠç¥ããããŸãïŒ
- å¹ççãªããŒã¿æ§é ã䜿çšããïŒ ç¹å®ã®ããŒãºã«æãå¹ççãªããŒã¿æ§é ãéžæããŠãã ãããäŸãã°ãã¡ã³ãã·ãããã¹ãã«ãªã¹ãã®ä»£ããã«ã»ããã䜿çšãããšãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããããšããããŸãã
- 颿°åŒã³åºããæå°éã«æããïŒ Pythonã§ã¯é¢æ°åŒã³åºãã¯æ¯èŒçé«äŸ¡ã«ãªãããšããããŸããããã©ãŒãã³ã¹ãéèŠãªã³ãŒãã»ã¯ã·ã§ã³ã§ã¯ã颿°åŒã³åºãã®æ°ãæå°éã«æããŠãã ããã
- çµã¿èŸŒã¿é¢æ°ã䜿çšããïŒ çµã¿èŸŒã¿é¢æ°ã¯äžè¬çã«é«åºŠã«æé©åãããŠãããã«ã¹ã¿ã å®è£ ãããé«éãªå ŽåããããŸãã
- ã°ããŒãã«å€æ°ãé¿ããïŒ ã°ããŒãã«å€æ°ãžã®ã¢ã¯ã»ã¹ã¯ãããŒã«ã«å€æ°ãžã®ã¢ã¯ã»ã¹ãããé ããªãããšããããŸããããã©ãŒãã³ã¹ãéèŠãªã³ãŒãã»ã¯ã·ã§ã³ã§ã¯ãã°ããŒãã«å€æ°ã®äœ¿çšãé¿ããŠãã ããã
- ãªã¹ãå å 衚èšãšãžã§ãã¬ãŒã¿åŒã䜿çšããïŒ ãªã¹ãå å 衚èšãšãžã§ãã¬ãŒã¿åŒã¯ãå€ãã®å ŽåãåŸæ¥ã®ã«ãŒããããå¹ççã§ãã
- Just-In-TimeïŒJITïŒã³ã³ãã€ã«ïŒ ã³ãŒããããã«æé©åããããã«ãNumbaãPyPyãªã©ã®JITã³ã³ãã€ã©ã®äœ¿çšãæ€èšããŠãã ãããJITã³ã³ãã€ã©ã¯ãå®è¡æã«ã³ãŒããåçã«ãã€ãã£ããã·ã³ã³ãŒãã«ã³ã³ãã€ã«ããå€§å¹ ãªããã©ãŒãã³ã¹åäžããããããŸãã
- CythonïŒ ããã«é«ãããã©ãŒãã³ã¹ãå¿ èŠãªå Žåã¯ãCythonã䜿çšããŠã³ãŒãã®ããã©ãŒãã³ã¹ãéèŠãªéšåãCã©ã€ã¯ãªèšèªã§èšè¿°ããããšãæ€èšããŠãã ãããCythonã³ãŒãã¯Cã³ãŒãã«ã³ã³ãã€ã«ãããPythonããã°ã©ã ã«ãªã³ã¯ããããšãã§ããŸãã
- éåæããã°ã©ãã³ã°ïŒasyncioïŒïŒ 䞊è¡I/Oæäœã«ã¯`asyncio`ã©ã€ãã©ãªã䜿çšããŠãã ããã`asyncio`ã¯ãã³ã«ãŒãã³ãšã€ãã³ãã«ãŒãã䜿çšããŠI/OããŠã³ããªã¿ã¹ã¯ã§é«ãããã©ãŒãã³ã¹ãå®çŸããã·ã³ã°ã«ã¹ã¬ããã®äžŠè¡æ§ã¢ãã«ã§ãããã«ãã¹ã¬ããããã«ãããã»ã¹ã®ãªãŒããŒããããé¿ãã€ã€ãè€æ°ã®ã¿ã¹ã¯ã®äžŠè¡å®è¡ãå¯èœã«ããŸãã
ãã«ãã¹ã¬ãããšãã«ãããã»ã¹ã®éžæïŒæ±ºå®ã¬ã€ã
ãã«ãã¹ã¬ãããšãã«ãããã»ã¹ã®ã©ã¡ãããéžæããã®ã«åœ¹ç«ã€ãç°¡ç¥åãããæ±ºå®ã¬ã€ãã¯æ¬¡ã®ãšããã§ãïŒ
- ã¿ã¹ã¯ã¯I/OããŠã³ãã§ããããããšãCPUããŠã³ãã§ããïŒ
- I/OããŠã³ãïŒ ãã«ãã¹ã¬ããïŒãŸãã¯`asyncio`ïŒãäžè¬çã«è¯ãéžæã§ãã
- CPUããŠã³ãïŒ GILã®å¶çŽãåé¿ãããããéåžžã¯ãã«ãããã»ã¹ã®æ¹ãè¯ãéžæè¢ã§ãã
- 䞊è¡ã¿ã¹ã¯éã§ããŒã¿ãå ±æããå¿ èŠããããŸããïŒ
- ã¯ãïŒ ã¹ã¬ããã¯åãã¡ã¢ãªç©ºéãå ±æããããããã«ãã¹ã¬ããã®æ¹ãã·ã³ãã«ãããããŸããããã ããåæã®åé¡ãç«¶åç¶æ ã«æ³šæããŠãã ããããã«ãããã»ã¹ã§ãå ±æã¡ã¢ãªã¡ã«ããºã ã䜿çšã§ããŸãããããæ éãªç®¡çãå¿ èŠã§ãã
- ãããïŒ åããã»ã¹ãç¬èªã®ã¡ã¢ãªç©ºéãæã€ããããã«ãããã»ã¹ã®æ¹ãåªããå颿§ãæäŸããŸãã
- å©çšå¯èœãªããŒããŠã§ã¢ã¯äœã§ããïŒ
- ã·ã³ã°ã«ã³ã¢ããã»ããµïŒ ãã«ãã¹ã¬ããã¯I/OããŠã³ããªã¿ã¹ã¯ã®å¿çæ§ãåäžãããããšãã§ããŸãããçã®äžŠåæ§ã¯äžå¯èœã§ãã
- ãã«ãã³ã¢ããã»ããµïŒ ãã«ãããã»ã¹ã¯ãCPUããŠã³ããªã¿ã¹ã¯ã«å¯ŸããŠå©çšå¯èœãªã³ã¢ãå®å šã«æŽ»çšã§ããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªèŠä»¶ã¯äœã§ããïŒ
- ãã«ãããã»ã¹ã¯ãã«ãã¹ã¬ãããããå€ãã®ã¡ã¢ãªãæ¶è²»ããŸããã¡ã¢ãªãå¶çŽã§ããå Žåããã«ãã¹ã¬ããã®æ¹ã奜ãŸãããããããŸããããGILã®å¶çŽã«å¯ŸåŠããå¿ èŠããããŸãã
ããŸããŸãªãã¡ã€ã³ã§ã®äŸ
ãã«ãã¹ã¬ãããšãã«ãããã»ã¹ã®ãŠãŒã¹ã±ãŒã¹ã説æããããã«ãããŸããŸãªãã¡ã€ã³ã«ãããããã€ãã®å®äžçã®äŸãèããŠã¿ãŸãããïŒ
- WebãµãŒããŒïŒ WebãµãŒããŒã¯éåžžãè€æ°ã®ã¯ã©ã€ã¢ã³ããªã¯ãšã¹ãã䞊è¡ããŠåŠçããŸãããã«ãã¹ã¬ããã䜿çšããŠåãªã¯ãšã¹ããå¥ã®ã¹ã¬ããã§åŠçããããšã§ããµãŒããŒã¯è€æ°ã®ã¯ã©ã€ã¢ã³ãã«åæã«å¿çã§ããŸãããµãŒããŒãäž»ã«I/OæäœïŒäŸïŒãã£ã¹ã¯ããã®ããŒã¿èªã¿åãããããã¯ãŒã¯çµç±ã§ã®ã¬ã¹ãã³ã¹éä¿¡ïŒãå®è¡ããå ŽåãGILã¯ããŸãåé¡ã«ãªããŸãããããããåçã³ã³ãã³ãçæã®ãããªCPUéçŽçãªã¿ã¹ã¯ã«ã¯ããã«ãããã»ã¹ã¢ãããŒãã®æ¹ãé©ããŠãããããããŸãããçŸä»£ã®Webãã¬ãŒã ã¯ãŒã¯ã¯ãéåæI/OåŠçïŒ`asyncio`ãªã©ïŒãšCPUããŠã³ããªã¿ã¹ã¯ã®ããã®ãã«ãããã»ã¹ãçµã¿åãããäž¡æ¹ã®ã¢ãããŒãããã䜿çšããŸããNode.jsã§ã¯ã©ã¹ã¿åãããããã»ã¹ã䜿çšããã¢ããªã±ãŒã·ã§ã³ããGunicornãšè€æ°ã®ã¯ãŒã«ãŒããã»ã¹ã䜿çšããPythonãèããŠã¿ãŠãã ããã
- ããŒã¿åŠçãã€ãã©ã€ã³ïŒ ããŒã¿åŠçãã€ãã©ã€ã³ã¯ãããŒã¿åã蟌ã¿ãããŒã¿ã¯ãªãŒãã³ã°ãããŒã¿å€æãããŒã¿åæãªã©ãè€æ°ã®ã¹ããŒãžã䌎ãããšããããããŸããåã¹ããŒãžãå¥ã®ããã»ã¹ã§å®è¡ããããšã§ãããŒã¿ã®äžŠååŠçãå¯èœã«ãªããŸããäŸãã°ãè€æ°ã®ãœãŒã¹ããã®ã»ã³ãµãŒããŒã¿ãåŠçãããã€ãã©ã€ã³ã¯ããã«ãããã»ã¹ã䜿çšããŠåã»ã³ãµãŒããã®ããŒã¿ãåæã«ãã³ãŒãããããšãã§ããŸããããã»ã¹ã¯ãã¥ãŒãå ±æã¡ã¢ãªã䜿çšããŠäºãã«éä¿¡ã§ããŸããApache KafkaãApache Sparkã®ãããªããŒã«ã¯ããã®ãããªé«åºŠã«åæ£ãããåŠçã容æã«ããŸãã
- ã²ãŒã éçºïŒ ã²ãŒã éçºã«ã¯ãã°ã©ãã£ãã¯ã¹ã®ã¬ã³ããªã³ã°ããŠãŒã¶ãŒå ¥åã®åŠçãã²ãŒã ç©çã®ã·ãã¥ã¬ãŒã·ã§ã³ãªã©ãããŸããŸãªã¿ã¹ã¯ãå«ãŸããŸãããã«ãã¹ã¬ããã䜿çšããŠãããã®ã¿ã¹ã¯ã䞊è¡ããŠå®è¡ããããšã§ãã²ãŒã ã®å¿çæ§ãšããã©ãŒãã³ã¹ãåäžããŸããäŸãã°ãå¥ã®ã¹ã¬ããã䜿çšããŠããã¯ã°ã©ãŠã³ãã§ã²ãŒã ã¢ã»ãããããŒãããã¡ã€ã³ã¹ã¬ããããããã¯ãããã®ãé²ãããšãã§ããŸãããã«ãããã»ã¹ã¯ãç©çã·ãã¥ã¬ãŒã·ã§ã³ãAIèšç®ã®ãããªCPUéçŽçãªã¿ã¹ã¯ã䞊ååããããã«äœ¿çšã§ããŸããã²ãŒã éçºã®ããã®äžŠè¡ããã°ã©ãã³ã°ãã¿ãŒã³ãéžæããéã«ã¯ãåãã©ãããã©ãŒã ã«ç¬èªã®ãã¥ã¢ã³ã¹ããããããã¯ãã¹ãã©ãããã©ãŒã ã®èª²é¡ã«æ³šæããŠãã ããã
- ç§åŠæè¡èšç®ïŒ ç§åŠæè¡èšç®ã¯ããã«ãããã»ã¹ã䜿çšããŠäžŠååã§ããè€éãªæ°å€èšç®ããã°ãã°äŒŽããŸããäŸãã°ãæµäœååŠã®ã·ãã¥ã¬ãŒã·ã§ã³ã¯ãããå°ããªãµããããã¬ã ã«åå²ã§ãããããããå¥ã®ããã»ã¹ã«ãã£ãŠç¬ç«ããŠè§£æ±ºãããŸããNumPyãSciPyã®ãããªã©ã€ãã©ãªã¯ãæ°å€èšç®ãå®è¡ããããã®æé©åãããã«ãŒãã³ãæäŸãããã«ãããã»ã¹ã䜿çšããŠè€æ°ã®ã³ã¢ã«ã¯ãŒã¯ããŒãã忣ãããããšãã§ããŸããç§åŠæè¡ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãå€§èŠæš¡ãªèšç®ã¯ã©ã¹ã¿ã®ãããªãã©ãããã©ãŒã ãæ€èšããŠãã ãããããã§ã¯ãåã ã®ããŒãã¯ãã«ãããã»ã¹ã«äŸåããŸãããã¯ã©ã¹ã¿ã忣ã管çããŸãã
çµè«
ãã«ãã¹ã¬ãããšãã«ãããã»ã¹ã®ã©ã¡ãããéžæããã«ã¯ãGILã®å¶çŽãã¯ãŒã¯ããŒãã®æ§è³ªïŒI/OããŠã³ã vs CPUããŠã³ãïŒããããŠãªãœãŒã¹æ¶è²»ãéä¿¡ãªãŒããŒããããäžŠåæ§ã®éã®ãã¬ãŒããªããæ éã«èæ ®ããå¿ èŠããããŸãããã«ãã¹ã¬ããã¯ãI/OããŠã³ããªã¿ã¹ã¯ãã䞊è¡ã¿ã¹ã¯éã§ããŒã¿ãå ±æããããšãäžå¯æ¬ ãªå Žåã«è¯ãéžæãšãªãåŸãŸãããã«ãããã»ã¹ã¯ãGILã®å¶çŽãåé¿ãããã«ãã³ã¢ããã»ããµäžã§çã®äžŠåå®è¡ãå¯èœã«ãããããäžè¬çã«äžŠååå¯èœãªCPUããŠã³ããªã¿ã¹ã¯ã«é©ããéžæè¢ã§ããåã¢ãããŒãã®é·æãšçæãçè§£ããããã©ãŒãã³ã¹åæãšãã³ãããŒãã³ã°ãè¡ãããšã§ãæ å ±ã«åºã¥ããæ±ºå®ãäžããPythonã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæé©åããããšãã§ããŸããããã«ãç¹ã«I/Oãäž»èŠãªããã«ããã¯ã«ãªããšäºæ³ãããå Žåã¯ã`asyncio`ã«ããéåæããã°ã©ãã³ã°ãæ€èšããããšãå¿ããªãã§ãã ããã
æçµçã«ãæåã®ã¢ãããŒãã¯ã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®èŠä»¶ã«äŸåããŸããç°ãªãäžŠè¡æ§ã¢ãã«ã詊ããŠãã®ããã©ãŒãã³ã¹ã枬å®ããããŒãºã«æé©ãªãœãªã¥ãŒã·ã§ã³ãèŠã€ããããšãèºèºããªãã§ãã ãããããã©ãŒãã³ã¹åäžãç®æãå Žåã§ããåžžã«æç¢ºã§ä¿å®æ§ã®é«ãã³ãŒããåªå ããããšãå¿ããªãã§ãã ããã